/**
 * Copyright (c) [2025] [何屹林]
 *
 * 保留所有权利。
 *
 * 文件名称：presolve.h
 * 模块功能说明：
 * 该模块定义全局变量和宏变量，定义了部分基本函数，承载了逻辑类中的预处理正则表达式的函数，并针对各种类型的正则表达式进行顺序编码。
 *
 * 华南师范大学-计算机学院-网络工程-1班
 * 作者：何屹林-20222132023
 * 完成日期：2025年7月24日
 */
#ifndef PRESOLVE_H
#define PRESOLVE_H

#pragma once

#include <QMainWindow>
#include <QFileDialog>
#include <QFile>
#include <QTextStream>
#include <QMessageBox>
#include<QString>
#include<QDebug>
#include<QChar>
#include<QMap>
#include<QMapData>
#include<QMapIterator>
#include<QVectorIterator>
#include<QVector>
#include<QListIterator>
#include<QList>

//退出标志，加在需要编码的单词后面
#define EXIT char(-1)
//任意符号
#define ANY '~'
//终结符
#define END '$'
//范围运算符号
#define RANGE '-'
//空字符
#define EMPTY char(0)

//char转string，便于输出表格时使用
#define STR(x) QString(1,x)
// 单词编码映射Token，利用这个MAP，先对单词进行一次默认编码
extern QMap<int, QString> Cd2Token;
//设置最终显示的单词编码，再设置一个新的MAP，根据老师的要求进行重新编码
//实现过程大致为：通过默认顺序编码锁定单词，再利用单词锁定老师要求的编号
extern QMap<QString,int>token_makecd;


// 单词编码优先级，对于存在多个选择的正则表达式（|符号组成），赋值2，对于需要概括的正则表达式（比如ID何NUM），赋值1，对于没有实际意义的正则表达式，赋值0
extern QHash<int, int> CdPrec;
//记录哈希表的大小，记录优先级表格的大小
extern int capacity;
//绑定单词内容和单词编码优先级，由于需要按照老师的要求重新编码，此处我们需要抛弃默认编码，利用单词名来对应优先级
extern QHash<QString,int>ccdd;

// 对于非|类型的正则表达式，定义一个数组进行归类，概括类放入0中，无实义类放入1
extern QVector<int> MainCd[2];

// 需要映射成char的string类型，对于程序语言中的反斜杠，需要特殊处理
extern QVector<QString> MapStr;

//字符集合映射表(xxx=[a-zA-Z])，用于处理正则表达式中的命名操作
extern QMap<QString,QSet<QChar>>CharSet;

//字符集合的映射集合
extern QSet<QChar> CharSetSym;


//防止字符冲突的map
extern QMap<QChar,QString>C2S;
extern QMap<QString,QChar>S2C;

//正则表达式运算符优先级
extern QMap<QChar,int>OpPrec;

//存储处理过后的正则表达式
extern QString resultText;

//中间形式的结果，只用于开发阶段测试中间结果是否正确，无实际作用
extern QString midText;
extern QString middText;

//NFA结点计数器
extern int NfaCnt;
//token计数器（0为终结符$）
extern int CdCnt;
//全局字符统计，存储输入的正则表达式的所有字符，后续遍历的时候需要使用
extern QSet<QChar>Chars;


//词法分析程序代码
//extern QString LexCode;


#endif // PRESOLVE_H
